#include "Dri_I2C.h"

void Dri_I2C_Init(void)
{
	 // // 配置时钟
     RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;

    // /*配置GPIO模式
    // PB10 通用开漏输出   输出频率最大 50MHZ  MODE10 11 CNF10 01
    // PB11 通用开漏输出   输出频率最大 50MHZ  MODE11 11 CNF11 01
    // */
    // GPIOB->CRH |= (GPIO_CRH_MODE10 | GPIO_CRH_MODE11 | GPIO_CRH_CNF10_0 | GPIO_CRH_CNF11_0);
    // GPIOB->CRH &= ~(GPIO_CRH_CNF10_1 | GPIO_CRH_CNF11_1);
     // 1. 配置时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    

    // 2. GPIO配置
    // PB10、PB11：通用开漏输出，MODE：11，CNF：01
    GPIOB->CRL |= (GPIO_CRL_MODE6 | GPIO_CRL_MODE7);  
    GPIOB->CRL &= ~(GPIO_CRL_CNF6_1 | GPIO_CRL_CNF7_1);
    GPIOB->CRL |= (GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0);

}

void Dri_I2C_Start(void)
{
    // 初始状态
    SDA_HIGH;
    SCL_HIGH;
    // 等待
    I2C_DEIAY;

    SDA_LOW;
    I2C_DEIAY;
}

void Dri_I2C_Stop(void)
{
    SCL_HIGH;
    SDA_LOW;
    I2C_DEIAY;

    SDA_HIGH;
    I2C_DEIAY;
}

void Dri_I2C_Ack(void)
{
    SDA_HIGH;
    SCL_LOW;
    I2C_DEIAY;
    
    SDA_LOW;
    I2C_DEIAY;

    // 时钟采样
    SCL_HIGH;
    I2C_DEIAY;

    SCL_LOW;
    I2C_DEIAY;
    // 采样完成 释放数据总线
    SDA_HIGH;
    I2C_DEIAY;
}

void Dri_I2C_Nack(void)
{
    SDA_HIGH;
    SCL_LOW;
    I2C_DEIAY;

    // 时钟采样
    SCL_HIGH;
    I2C_DEIAY;

    SCL_LOW;
    I2C_DEIAY;
}

uint8_t Dri_I2C_Wait4Nack(void)
{
    // 释放总线 ,等待从机发送应答信号
    SDA_HIGH;
    SCL_LOW;
    I2C_DEIAY;

    SCL_HIGH;
    I2C_DEIAY;
    // 读取数据总线 查看从机发送的信号
    uint8_t ack = ACK;
    // 如果信号是 1 则非应答
    if (READ_SDA)
    {
        ack = NACK;
    }
    SCL_LOW;
    I2C_DEIAY;

    // SDA_HIGH;
    return ack;
}

void Dri_I2C_WriteByte(uint8_t byte)
{
    for (uint8_t i = 0; i < 8; i++)
    {
        SDA_LOW;
        SCL_LOW;
        I2C_DEIAY;
        // 读取要写的字符最高位的值
        if (byte & 0x80)
        {
            SDA_HIGH;
        }
        else
        {
            SDA_LOW;
        }
        I2C_DEIAY;

        // 时钟采样
        SCL_HIGH;
        I2C_DEIAY;

        // 采样完成
        SCL_LOW;
        I2C_DEIAY;
        // 采样完成最高位移出去，准备采样下一位
        byte <<= 1;
    }

}

uint8_t Dri_I2C_ReadByte(void)
{
    uint8_t data = 0;
    // SDA_HIGH;
    // I2C_DEIAY;
    for (uint8_t i = 0; i < 8; i++)
    {
     
        SCL_LOW;
        I2C_DEIAY;
        // 时钟采样
        SCL_HIGH;
        I2C_DEIAY;
        // 左移一位，准备写在最低位
        data <<= 1;
        // 读取要的字符最高位的值


        if (READ_SDA)
        {
            data |= 0x01;
        }


        // 采样完成
        SCL_LOW;
        I2C_DEIAY;
    }
    return data;
}
